
function User(){
    this.data = {};
    var me = this;
    clientCollect.sendAuthUserInfo = function (data, appid) {
        return me.update(data, appid, true);
    };
}
var UserPrototype = User.prototype;
UserPrototype.name = "user";
UserPrototype.report = function(){
    return extend(
        {
            "url": encodeURIComponent(window.location.href)
            ,"category": "behavior"
            ,"action": "user_detail"
        }
        ,this.data
    );
}
/**
 * 基本数据结构，值声明了可能获取到数据的字段
 * @type {Object}
 */
UserPrototype.MODEL = {
    "nickname": ["nickname"]
    ,"head_url": ["headimgurl"]
    ,"sex": ["sex"]
    ,"country": ["country"]
    ,"province": ["province"]
    ,"city": ["city"]
    ,"district": ["district"]
    ,"user_mark": ["openid"]
}

/**
 * 按照传入的数组获取对象中的数据
 * @param  {Object} dat 原始数据对象
 * @param  {Array}  arr 可能获取到数据的字段数组
 * @return {Mix}        数据，获取不到的时候默认是空值
 */
function getVal(dat, arr) {
    var re = "";
    if (isObject(dat) && isArray(arr)) {
        for (var i = 0; i < arr.length; i++) {
            if (!isUndef(dat[arr[i]])) {
                re = dat[arr[i]];
                delete dat[arr[i]];
                break;
            }
        }
    }
    return re;
}

/**
 * 平台对应的值
 * @type {Object}
 */
var plat_map = {
    "wechat": 1
    ,"alipay": 2
};

/**
 * 获取平台对应 id
 * @return {Int} 平台id，0是未知
 */
function getPlat() {
    for (var n in plat_map) {
        if (plat[n]) {
            return plat_map[n];
        }
    }
    return 0;
}

// 平台 id
var plat_id = getPlat();

/**
 * 更新用户数据
 * @param  {Object}  data   原始数据
 * @param  {String}  appid  公众号 appid
 * @param  {Boolean} send   是否发送用户身份数据
 * @return {Boolean}        是否执行了发送行为
 */
UserPrototype.update = function(data, appid, send) {
    if (isObject(data)) {
        var dat = {};
        // 按照模型获取数据
        each(this.MODEL, function(val, key) {
            dat[key] = getVal(data, val);
        });
        // 获取完模型数据后将剩余的数据加入进去
        dat = extend(dat, data);

        // 处理性别
        dat.sex = Number(dat.sex);
        dat.sex = isNaN(dat.sex) ? 0 : dat.sex;

        dat.plat_id = plat_id;
        dat.appid = appid || "";
        this.data = dat;
    }
    send = isUndef(send) ? false : Boolean(send);

    if (data && this.data.user_mark) {
        // 成功拿到用户身份 id 后更新通用数据字段中的 user_id
        clientCollect.user_mark = this.data.user_mark;
    }
    if (data && send) {
        clientCollect.send("event", null, "user");
    }
    return send;
}

clientCollect.add(User);
